package com.wql.aop01.service.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.concurrent.ExecutionException;

/**
 * @author wql
 * @version 1.0
 * @date 2022/11/11 16:16
 */
@Component
@Aspect
public class TransationAspect {
    //切点
    @Pointcut("execution(public void com.wql.aop01.service.impl.*.*(..))")
    public void transationAdvice(){}
//    @Before("transationAdvice()")
//    public void before(){
//        System.out.println("前置通知-----可以模拟开启事务等");
//    }
//    @After("transationAdvice()")
//    public void after(){
//        //方法执行完毕的通知（有无异常都执行）
//        System.out.println("后置通知");
//    }
//    @AfterReturning("transationAdvice()")
//    public void afterReturning(){
//        //如果出现异常则不执行，因为有异常执行会执行异常通知，方法没有执行完毕
//        //他和异常通知只有一个能执行，有你没我，有我没你
//        System.out.println("后置返回通知");
//    }
//    @AfterThrowing("transationAdvice()")
//    public void afterThrowing(){
//        System.out.println("异常通知");
//    }
    @Around("transationAdvice()")
    public void around(ProceedingJoinPoint joinPoint){
        System.out.println("环绕通知");
        try {
            joinPoint.proceed();//调用连接点方法
            System.out.println("方法执行完毕");
        }catch (Throwable throwable){
            System.out.println("环绕通知异常");
        }finally {
            System.out.println("环绕通知-后置");
        }
    }
}
